package cn.csust.net2.manager.server.dao;

import java.util.List;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.classic.Session;
import org.hibernate.criterion.DetachedCriteria;

import com.extjs.gxt.ui.client.data.BaseListLoadConfig;
import com.extjs.gxt.ui.client.data.BasePagingLoadResult;
import com.extjs.gxt.ui.client.data.PagingLoadConfig;
/**
 * 1.修改了DAO层的API实现，将大部分HQL都转化为Criteria高级查询API，并且废弃了原有的一些方法
 * 2.HIBEERNATE的异常不会再被显示的抛出，而是在其内部已经进行了捕捉， 在应用的上层应该同样的去处理这些不可恢复的异常
 * 3.模糊查找没有留API
 * @author 韩忠金
 *
 * @param <T>
 */
public interface BaseDAO<T> {
	public <G> void save(G t);
	public <G> void delete(G t);
	public <G> void update(G t);
	public <G> BasePagingLoadResult<G> findAllByPaging(PagingLoadConfig config);
	/**
	 * 过期
	 * @param key
	 * @param value
	 * @return
	 */
	@Deprecated
	public List<T> find(String key,String value);
	/**
	 * 
	 * @return
	 */
	public List<T> findAll();
	public List<T> findAll(BaseListLoadConfig config, String hql);
	public List<T> findAll(BaseListLoadConfig config, String hql,Map<String,Object> map);
	/**
	 * 过期(现在由findListByExample代替)：按照实例查找
	 * 	/**
	 * ******************************** 方法作废（可已使用高级查找的API代替手动的组装HQL） ***********************************
	 * 
	 * 
	 * 进行条件查询根据给出的对象模板的条件生成HQL进行查询
	 * 减少对对象的LIST作为查询条件
	 * 发生关联时候，关联对象作为条件需要主见是又值得
	 *
	 * @param t
	 * @return
	 */
	@Deprecated
	public List<T> findByExample(T t);
	/**
	 * 按照高级查找条件（单个结果）
	 * @param criteria
	 * @return
	 */
	public T findUniqueByCritera(DetachedCriteria criteria);
	/**
	 * 按照高级查找条件（List）
	 * 	/**
	 * 
	 * DetachedCriteria类的初始化方法
	 * 	DetachedCriteria dc =DetachedCriteria.forClass(User.class).addOrder(Order.asc("lastname"));
	 * 在service层中进行组装条件然后调用这个公用的dao方法
	 * 使用时在特定的service中使用
	 * 
	 * 
	 * 
	 * 
	 * @param criteria
	 * @return
	 */
	public List<T> findListByCritera(DetachedCriteria criteria);
	/**
	 * 按实例查找（List）
	 * @param t
	 * @return
	 */
	public List<T> findListByExample(T t);
	/**
	 * 按实例查找（单个结果）
	 * @param t
	 * @return
	 */
	public T findUniqueByExample(T t);
	/**
	 * 按实例分页查找
	 * @param t
	 * @param config
	 * @return
	 */
	public BasePagingLoadResult<T> findByPaging(T t, PagingLoadConfig config);
	
	/**
	 * 查询条数
	 * @param t
	 * @return
	 */
	public long counts(T t);
	/**
	 * HQL接口
	 * @param hql
	 * @return
	 */
	public  List<T> findListByHQL(String hql);
	public  List<T> findListByHQL(String hql,Map<String,Object> map);
	/**
	 * HQL接口
	 * @param hql
	 * @return
	 */
	public T findUniqueHQL(String hql);
	public T findUniqueHQL(String hql,Map<String,Object> map);
	/**
	 * HQL接口(使用泛型参数，就是与T泛型无关)
	 * @param hql
	 * @return
	 */
	public <S>  List<S> findListByHQL_T(String hql);
	public <S>  List<S> findListByHQL_T(String hql,Map<String,Object> map);
	/**
	 * HQL接口(使用泛型参数，就是与T泛型无关)
	 * @param hql
	 * @return
	 */
	public <S> S findUniqueHQL_T(String hql);
	public <S> S findUniqueHQL_T(String hql,Map<String,Object> map);
	/**
	 * HQL接口(使用Object参数，就是与T泛型无关)
	 * @param hql
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public   List findListByHQL_O(String hql);
	@SuppressWarnings("rawtypes")
	public   List findListByHQL_O(String hql,Map<String,Object> map);
	/**
	 * HQL接口(使用Object参数，就是与T泛型无关)
	 * @param hql
	 * @return
	 */
	public Object findUniqueHQL_O(String hql);
	public Object findUniqueHQL_O(String hql,Map<String,Object> map);
	/**
	 * 给予SERVICE层直接索引数据库权限
	 * 虽然破坏了DAO层的访问权限，但是有助与一些复杂的查询
	 * 其中包括
	 * 1.聚合
	 * 2.报表
	 * 3.运行时设置访问策略
	 * 4.复杂的查询
	 * @return
	 */
	public Criteria getThreadCriteria();
	/**
	 * 在GRID分页显示的时候负责用HQL查询的
	 */
	public <G> BasePagingLoadResult<G> findAllByPaging(PagingLoadConfig config,String hql,Map<String,Object> map);
	/**
	 * 在GRID分页显示的时候负责用HQL查询的
	 */
	public <G> BasePagingLoadResult<G> findAllByPaging(PagingLoadConfig config,String hql);
	/**
	 * 在GRID分页显示的时候负责用SQL查询的
	 */
	public <G> BasePagingLoadResult<G> findAllByPagingBySQL(PagingLoadConfig config,String sql,Class<?> cla);
	public <G> BasePagingLoadResult<G> findAllByPagingBySQL(PagingLoadConfig config,String sql,Class<?> cla,Map<String,Object> map);
	long countsByHQL(String hql);
	long countsByHQL(String hql,Map<String,Object> map);
	public <G> List<G> findListBySQL(String sql);
	public <G> List<G> findListBySQL(String sql,Map<String,Object> map);
	public <G> G findUniqueBySQL(String sql);
	public <G> G findUniqueBySQL(String sql,Map<String,Object> map);
	/**
	 * 留给service的Session接口，虽然破坏3层接口但是满足例如权限这样子的特别查询
	 */
	public Session getCurrentSession();
	public long countsBySQL(String sql);
	public long countsBySQL(String sql,Map<String,Object> map);
	
	
 }
